﻿import type { RequestOptions } from '@@/plugin-request/request';
import type { RequestConfig } from '@umijs/max';
import { message } from "antd";

// 定义错误信息的展示方式，用于前端根据返回的 showType 决定如何反馈错误
enum ErrorShowType {
  SILENT = 0,           // 静默处理，不做任何提示
  WARN_MESSAGE = 1,     // 显示警告信息
  ERROR_MESSAGE = 2,    // 显示错误信息
  NOTIFICATION = 3,     // 弹出通知
  REDIRECT = 9,         // 重定向
}

// 统一定义后端返回的数据结构
interface ResponseStructure {
  success: boolean;         // 是否成功
  data: any;                // 实际数据
  errorCode?: number;       // 错误码
  errorMessage?: string;    // 错误信息
  showType?: ErrorShowType; // 错误提示的展示方式
}

/**
 * @name 请求配置（全局）
 * 用于配置 baseURL、请求/响应拦截器等
 * 文档：https://umijs.org/docs/max/request#配置
 */
export const requestConfig: RequestConfig = {
  // TODO: 根据项目实际情况配置 baseURL
  baseURL: 'http://localhost:18090',

  // 跨域时发送 cookie
  withCredentials: true,

  // 请求拦截器，可用于添加 token 或修改请求参数
  requestInterceptors: [
    (config: RequestOptions) => {
      // 你可以在这里对请求的 config 做统一处理，比如添加自定义 header
      const url = config?.url;
      return { ...config, url };
    },
  ],

  // 响应拦截器，用于处理响应结果或统一错误处理逻辑
  responseInterceptors: [
    (response) => {
      // 将响应体强制转换为我们定义的结构
      const { data } = response as unknown as ResponseStructure;

      // 如果不是成功的 code 且响应不是文件类型等特殊内容，则处理错误信息
      if (
        data.code !== 0 &&
        response.headers['content-type'] !== 'image/jpeg' &&
        response.headers['content-type'] !== 'text/html;charset=utf-8' &&
        response.headers['content-type'] !== 'application/octet-stream' &&
        response.headers['content-type'] !== 'application/vnd.ms-excel;charset=utf-8'
      ) {
        // 处理权限相关的错误码
        if (
          data.code === 40100 || // 未登录
          data.code === 40301 || // 没有操作权限
          data.code === 40300 || // 没有访问权限
          data.code === 40101    // 登录过期
        ) {
          // 跳转到登录页
          history.push('/user/login');

          // 清除 authorization 的 cookie
          document.cookie = 'authorization=;expires=Thu, 01 Jan 1970 00:00:00 GMT';

          // 可选：清除 localStorage 中用户信息
          // localStorage.removeItem("api-open-platform-user");

          if (data.code === 40100) {
            // 如果是未登录（首次访问），静默跳转，不提示错误信息
            return response;
          }
        }
        // 其他错误统一提示错误信息（message 属性）
        message.error(data.message);
      }
      // 返回原始响应数据（用于后续使用）
      return response;
    },
  ],
};
